﻿using System;
using System.Data;
using System.Runtime.InteropServices;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

namespace AZProjekt
{
    public class InputReader
    {
        /// <summary>
        /// Odczytuje jsona z pliku .txt i parsuje na dwuwymiarowa macierz edges
        /// </summary>
        /// <param name="fileName">Nazwa pliku .txt podana bez rozszerzenia</param>
        /// <returns>Tablica połączeń między wierzchołkami</returns>
        public int[][] JsonFileToArray(string fileName)
        {
            string json = System.IO.File.ReadAllText(@"Input\" + fileName + ".txt");
            return JsonToArray(json);
        }

        public int[][] JsonToArray(string json)
        {
            DataSet dataSet = JsonConvert.DeserializeObject<DataSet>(json);
            DataTable dataTable = dataSet.Tables["Graph"];
            int length = ((string)dataTable.Rows[0]["connections"]).Length;
            int[][] edges = new int[length][];

            
            // długość  stringu 'connections' jest za krótka lub za długa, chroni przed IndexOutOfRangeException
            for (int i = 0; i < dataTable.Rows.Count; i++)
            {
                if (((string)dataTable.Rows[i]["connections"]).Length != dataTable.Rows.Count)
                {
                    Console.WriteLine("Błąd w pliku json!\nDługość stringu 'connections' nie zgadza się w wierzchołku o id: " + i);
                    Console.WriteLine("Aby zakończyć wciśnij enter");
                    Console.ReadLine();
                    return null;
                }
            }


            for (int i = 0; i < length; i++)
            {
                edges[i] = new int[length];
                Array.Clear(edges[i], 0, length);
            }

            foreach (DataRow row in dataTable.Rows)
                for (int i = 0; i < length; i++)
                    edges[int.Parse((string)row["id"])][i] = ((string)row["connections"])[i] - '0';

            return edges;
        }

        public bool IsJsonFile(string fileName)
        {
            string json = System.IO.File.ReadAllText(@"Input\" + fileName + ".txt");
            return IsJson(json);
        }

        public bool IsJson(string json)
        {
            try
            {
                JToken ok = JToken.Parse(json);
                return true;
            }
            catch (Exception)
            {
                Console.WriteLine("Podany plik nie jest poprawnym plikiem json!");
                Console.WriteLine("Aby zakończyć wciśnij enter");
                Console.ReadLine();
                return false;
            }
        }


        public bool CheckJsonFile(int[][] edges)
        {
            foreach (var edge in edges)
            {
                int index = Array.FindIndex(edges, e=>e==edge);
                
                for (int i = 0; i < edge.GetLength(0); i++)
                {
                   
                    if (edge[i]<0 || edge[i]>1)
                    {
                        Console.WriteLine("Błąd w pliku json w wierzchołku o id: " + index +
                                          "\nMożliwe wartości to 0 (brak krawędzi) lub 1 (istnieje krawędź)");
                        Console.WriteLine("Aby zakończyć wciśnij enter");
                        Console.ReadLine();
                        return false;
                    }

                    if (index == i)
                    {
                        //pętla z tego samego wierzchołka do tego samego
                        if (edge[i] == 1)
                        {
                            Console.WriteLine("Błąd w pliku json!\nPętla w wierzchołku o id: "+index);
                            Console.WriteLine("Aby zakończyć wciśnij enter");
                            Console.ReadLine();
                            return false;
                        }
                       
                    }
                    else
                    {
                        var edge2 = edges[i];
                        //z jednego wierzchołka do drugiego istnieje krawędź, ale z drugiego do pierwszego nie-> błąd!
                        if (edge[i] != edge2[index])
                        {
                            Console.WriteLine("Błąd w pliku json!\n" +
                                              "Sprawdź połączenia między wierzchołkami o id: "+index+" oraz "+i);
                            Console.WriteLine("Aby zakończyć wciśnij enter");
                            Console.ReadLine();
                            return false;
                        }
                        
                        
                    }

                }
            }

            return true;
        }
    }
}
